在读取Python文件中的行时跳过前几行

您所在的位置:网站首页 python 文件多少行 在读取Python文件中的行时跳过前几行

在读取Python文件中的行时跳过前几行

2023-08-16 00:34| 来源: 网络整理| 查看: 265

我想在阅读文本文件时跳过前17行。

假设文件看起来像:

1234567891011121314151617180 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 good stuff

我只想要好东西。 我正在做的事情要复杂得多,但这是我遇到的麻烦。

相关讨论 stackoverflow.com/questions/620367/或stackoverflow.com/questions/4796764/等。?

使用切片,如下所示:

12with open('yourfile.txt') as f:     lines_after_17 = f.readlines()[17:]

如果文件太大而无法加载到内存中:

12345with open('yourfile.txt') as f:     for _ in range(17):         next(f)     for line in f:         # do stuff 相关讨论 我使用第二种解决方案在一个文件的末尾读取10行,该行有800万(8e6)行,大约需要22秒。对于这么长的文件(?250 MB),这仍然是首选(=最快)的方法吗? 我会使用tail。 @wim:我想,tail在Windows上不起作用。此外,我并不总是想阅读最后10行。我希望能够阅读中间的几行内容。 (例如,如果我在同一文件中的?4e6行之后读取10行,则仍然需要一半的时间,?11秒) 事实是,您需要在行号?4e6之前读取全部内容,才能知道行分隔符字节的位置,否则您将不知道经过了多少行。没有办法神奇地跳到行号。大约250 MB应该可以将整个文件读取到内存中,那并不是特别大的数据。 @riddleculous参见stackoverflow.com/q/3346430/2491761以获取最后一行

从索引17开始使用itertools.islice。它将自动跳过前17行。

1234import itertools with open('file.txt') as f:     for line in itertools.islice(f, 17, None):  # start=17, stop=None         # process lines 相关讨论 可能是最好的答案

12for line in dropwhile(isBadLine, lines):     # process as you see fit

完整演示:

12345678from itertools import * def isBadLine(line):     return line=='0' with open(...) as f:     for line in dropwhile(isBadLine, f):         # process as you see fit

优点:这可以很容易地扩展到前缀行比" 0"复杂(但不相互依赖)的情况。

此解决方案帮助我跳过了linetostart变量指定的行数。 如果您也想跟踪索引,则可以得到索引(int)和行(字符串)。 在您的情况下,可以将linetostart替换为18,或者将18分配给linetostart变量。

123f = open("file.txt", 'r') for i, line in enumerate(f, linetostart):     #Your code

以下是前2个答案的时间结果。请注意," file.txt"是一个文本文件,包含100,000多行随机字符串,文件大小为1MB +。

使用itertools:

12345678import itertools from timeit import timeit timeit("""with open("file.txt","r") as fo:     for line in itertools.islice(fo, 90000, None):         line.strip()""", number=100) >>> 1.604976346003241

使用两个for循环:

123456789from timeit import timeit timeit("""with open("file.txt","r") as fo:     for i in range(90000):         next(fo)     for j in fo:         j.strip()""", number=100) >>> 2.427317383000627

显然,在处理大文件时,itertools方法更有效。

如果您不想一次将整个文件读入内存,可以使用一些技巧:

使用next(iterator),您可以前进到下一行:

123456with open("filename.txt") as f:      next(f)      next(f)      next(f)      for line in f:          print(f)

当然,这很难看,所以itertools有一个更好的方法:

123456from itertools import islice with open("filename.txt") as f:     # start at line 17 and never stop (None), until the end     for line in islice(f, 17, None):          print(f)

如果是桌子。

pd.read_table("path/to/file", sep="\t", index_col=0, skiprows=17)

这是一种获取文件中两个行号之间的行的方法:

12345678910111213141516import sys def file_line(name,start=1,end=sys.maxint):     lc=0     with open(s) as f:         for line in f:             lc+=1             if lc>=start and lc EOF

您可以使用List-Comprehension使其成为单线:

1[fl.readline() for i in xrange(17)]

PEP 202和Python文档中有关列表理解的更多信息。

相关讨论 将这些行存储在只会收集垃圾的列表中没有多大意义。 @wim:内存开销是微不足道的(这可能是不可避免的,因为除非您跳到文件中的任意点,否则您将需要对这些行进行O(n)处理);我只是不认为它非常可读。 我同意@wim,如果您要放弃结果,请使用循环。列表理解的全部要点是您打算存储列表。您可以轻松地将for循环放在一行上。 或在0内存双端队列中使用生成器。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3